package burubaka.common.controller;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;

import net.arnx.jsonic.JSON;

import org.slim3.controller.Navigation;
import org.slim3.util.RequestMap;

import burubaka.BurubakaConstants;

/**
 * @author tk
 * 
 */
public class Controller extends org.slim3.controller.Controller {

	private static final String REQKEY_COMMAND = "command";
	private static final Logger log = Logger.getLogger(Controller.class.getName());

	protected Map<String, Object> reqMap;

	/**
	 * 初期化
	 * 
	 * @param reqMap
	 * @return Navigation
	 * @throws Exception
	 */
	public Navigation init() throws Exception {
		return null;
	}

	/**
	 * 検索
	 * 
	 * @return Navigation
	 * @throws Exception
	 */
	// protected Navigation search() throws Exception {
	// return null;
	// }
	//
	// /**
	// * 登録
	// *
	// * @return Navigation
	// * @throws Exception
	// */
	// protected Navigation regist() throws Exception {
	// return null;
	// }
	//
	/**
	 * 削除
	 * 
	 * @return Navigation
	 * @throws Exception
	 */
	// protected Navigation delete() throws Exception {
	// return null;
	// }

	@Override
	public Navigation run() throws Exception {

		reqMap = new RequestMap(request);
		log.fine(reqMap.toString());
		String cmd = (String) reqMap.get(REQKEY_COMMAND);

		if (cmd == null) {
			// Navigation ret = init();
			// if (ret == null) {
			// throw new NullPointerException("command is null");
			// }
			return init();
		}

		// // 初期化
		// if (cmd.equals("init")) {
		// return init();
		// }
		//
		// // 検索
		// if (cmd.equals("search")) {
		// return search();
		// }
		//
		// // 登録
		// if (cmd.equals("regist")) {
		// return regist();
		// }
		//
		// // 削除
		// if (cmd.equals("delete")) {
		// return delete();
		// }

		Method method = this.getClass().getMethod(cmd, null);
		return (Navigation) method.invoke(this, null);
	}

	/**
	 * レスポンスにJSONデータを設定する。
	 * 
	 * @param json
	 * @throws Exception
	 */
	protected void setJson(String json) throws Exception {
		response.setContentType("application/json; charset=UTF-8");
		response.getWriter().write(json);
		response.getWriter().flush();
	}

	/**
	 * レスポンスにエラーメッセージをJSONデータで設定する。
	 * 
	 * @param msg
	 * @throws Exception
	 */
	protected void setErrorJson(String msg) throws Exception {
		Map<String, Object> resMap = new HashMap<String, Object>();
		resMap.put(BurubakaConstants.RESPONSEKEY_ERROR, msg);
		setJson(JSON.encode(resMap, true));
	}
}
